package myjdbc;

import java.sql.*;

/**
 * @Auther: cty
 * @Date: 2020/1/19 11:22
 * @Description:  JDBC访问MySQL数据库，通过参数传递，实现存入一条记录，
 *                PreparedStatement避免参数传递过程中的SQL注入问题
 * PreparedStatement优点：
 * （1）效率高，先预编译再执行
 * （2）避免SQL注入，传递参数时只允许指定数据类型的参数
 * @version: 1.0
 */
public class JDBC_Demo03_Prepared {

    public static final String URL = "jdbc:mysql://localhost:3306/testjdbc";
    public static final String USER = "root";
    public static final String PASSWORD = "123456";

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1. 加载MySQL驱动程序
        Class.forName("com.mysql.jdbc.Driver");

        //2. 获得数据库连接
        Connection conn = DriverManager.getConnection(URL,USER,PASSWORD);

        //3. 操作数据库，实现增删改查
        //通过PreparedStatement进行参数传递，实现存入一条记录
        String sql = "insert into user(username,pwd,regTimestamp,infoVarchar) values(?,?,?,?)";  //?是占位符
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setString(1,"cty");  //参数索引从1开始计算；setString可换为setObject，下同
        ps.setString(2,"123456");
        ps.setDate(3, new java.sql.Date(System.currentTimeMillis()));
        ps.setString(4,"我叫cty，今年23岁了。");
        int rs = ps.executeUpdate();

        //4. 处理返回数据——如果有数据，rs为更新的行数
        System.out.println("更新了"+rs+"条记录！");

        //5. 关闭连接
        if(ps!=null){
            ps.close();
        }
        if(conn!=null){
            conn.close();
        }


        // 标准写法
        // Connection conn = null;
        // PreparedStatement ps = null;
        // int rs = -1;
        // try {
        //     //1. 加载MySQL驱动程序
        //     Class.forName("com.mysql.jdbc.Driver");
        //     //2. 获得数据库连接
        //     conn = DriverManager.getConnection(URL,USER,PASSWORD);

        //     //3. 操作数据库，实现增删改查
        //     //通过PreparedStatement进行参数传递，实现存入一条记录
        //     String sql = "insert into user(username,pwd,regTimestamp,infoVarchar) values(?,?,?,?)";  //?是占位符
        //     ps = conn.prepareStatement(sql);
        //     ps.setString(1,"cty");  //参数索引从1开始计算；setString可换为setObject，下同
        //     ps.setString(2,"123456");
        //     ps.setDate(3, new java.sql.Date(System.currentTimeMillis()));
        //     ps.setString(4,"我叫cty，今年23岁了。");
        //     rs = ps.executeUpdate();

        //     //4. 处理返回数据——如果有数据，rs为更新的行数
        //     System.out.println("更新了"+rs+"条记录！");
        // } catch (ClassNotFoundException e) {
        //     e.printStackTrace();
        // } catch (SQLException e) {
        //     e.printStackTrace();
        // } finally {
        //     //5. 关闭连接
        //     try {
        //         if(ps!=null){
        //             ps.close();
        //         }
        //     } catch (SQLException e) {
        //         e.printStackTrace();
        //     }

        //     try {
        //         if(conn!=null){
        //             conn.close();
        //         }
        //     } catch (SQLException e) {
        //         e.printStackTrace();
        //     }
        // }
    }
}

/* res:
更新了1条记录！
*/